package com.spring.lesson001.demo4.factory;

import org.springframework.beans.factory.ObjectFactory;
import org.springframework.lang.Nullable;

/**
 * Scope的描述
 *
 * @author vhans
 */
public interface MyScope {
    /**
     * 返回当前作用域中name对应的bean对象
     *
     * @param name          需要检索的bean名称
     * @param objectFactory 如果未找到name对应的bean，则可以调用ObjectFactory来创建这个bean对象
     * @return bean对象
     */
    Object get(String name, ObjectFactory<?> objectFactory);

    /**
     * 将name对应的bean从当前作用域中移除
     */
    @Nullable
    Object remove(String name);

    /**
     * 用于注册销毁回调，如果想要销毁相应的对象，则由Spring容器注册相应的销毁回调，再由自定义作用域选择是不是要销毁相应的对象
     *
     * @param name     bean名称
     * @param callback 回调
     */
    void registerDestructionCallback(String name, Runnable callback);

    /**
     * 用于解析相应的上下文数据，比如request作用域会返回request中的属性
     *
     * @param key 作用域键
     * @return 属性
     */
    @Nullable
    Object resolveContextualObject(String key);

    /**
     * 返回作用域的会话标识，比如session作用域将是sessionId
     */
    String getConversationId();
}
